package es.uca.gii.csi.Shield.data;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;

public class Agente {
	
	private int _iIdentificador;
	private String _sNombre;
	private int _iAnosServicio;
	private  Calendar _calFechaValidezLicencia;
	private static boolean _bEliminado=false;
	
	
	/**
	 *  Devuelve el valor de la variable _iIdentificador
	 * @exception no se generan excepciones
	 * @return _iIdentificador
	 * @param no recibe parametros de entrada
	 */
	public int getIdentificador ()
	{
		return _iIdentificador;
	}
	
	/**
	 * Modifica el valor de la variable _iIdentificador
	 * @exception no se generan excepciones
	 * @return no devuelve nada
	 * @param  int iIdentificador
	 */
	public void setIdentificador (int iIdentificador)
	{
		_iIdentificador = iIdentificador;
	}
	
	/**
	 *  Devuelve el valor de la variable _sNombre
	 * @exception no se generan excepciones
	 * @return _sNombre
	 * @param no recibe parametros de entrada
	 */
	public String getNombre ()
	{
		return _sNombre;
	}
	
	/**
	 *  Modifica el valor de la variable _sNombre
	 * @exception no se generan excepciones
	 * @return no devuelve nada
	 * @param  String sNombre
	 */
	public void setNombre (String sNombre)
	{
		_sNombre = sNombre;
	}
	
	/**
	 *  Devuelve el valor de la variable _iAnosServicio
	 * @exception no se generan excepciones
	 * @return _iAnosServicio
	 * @param no recibe parametros de entrada
	 */
	public int getAnosServicio ()
	{
		return _iAnosServicio;
	}
	
	/**
	 *  Modifica el valor de la variable _iAnosServicio
	 * @exception no se generan excepciones
	 * @return no devuelve nada
	 * @param  int iAnosServicio
	 */
	public void setAnosServicio (int iAnosServicio)
	{
		_iAnosServicio = iAnosServicio;
	}
	
	/**
	 *  Devuelve el valor de la variable _calFechaValidezLicencia
	 * @exception no se generan excepciones
	 * @return _cFechaValidezLicencias
	 * @param no recibe parametros de entrada
	 */
	public Calendar getFechaValidezLicencia ()
	{
		return _calFechaValidezLicencia;
	}
	
	/**
	 *  Modifica el valor de la variable _calFechaValidezLicencia
	 * @exception no se generan excepciones
	 * @return no devuelve nada
	 * @param  Date cFechaValidezLicencia
	 */
	public void setFechaValidezLicencia ( Calendar cFechaValidezLicencia )
	{
		_calFechaValidezLicencia = cFechaValidezLicencia;
	}
	
	/**
	 * Comprueba si el Agente existe en la base de datos, en caso afirmativo lo elimina
	 * @throws Exception
	 * @param no recibe parámetros de entrada
	 */
	public void Delete( ) throws Exception
	{
		if (_bEliminado == true)
		{
			throw new Exception( "El Agente sobre el que esta intentando actualizar "
					+ "los valores se ha eliminado" );
		}
		Connection connection = null;
        try 
        {
	           connection = Data.Connection();
	           connection.createStatement().executeUpdate(
	        		   String.format("DELETE FROM agente WHERE Identificador = %i ",_iIdentificador));
	           _bEliminado=true;
        }catch (SQLException ee) { throw ee; }
        finally 
        {
	           if (connection != null) connection.close();
        }
	}
	
	/**
	 * Comprueba que el Agente existe en la base de datos y actualiza sus datos 
	 * @throws Exception
	 * @param no recibe parámetros de entrada
	 */
	public void Update( ) throws Exception
	{
		if (_bEliminado == true)
		{
			throw new Exception( "El Agente sobre el que estn intentando actualizar "
					+ "los valores se ha eliminado" );
		}
		SimpleDateFormat sdfFecha = new SimpleDateFormat("yyyy-MM-dd");
        String sFechaValidezLicencia = sdfFecha.format(_calFechaValidezLicencia.getTime());
		Connection connection = null;
        try 
        {
	           connection = Data.Connection();
	           connection.createStatement().executeUpdate("UPDATE agente SET "
	           				+ "Nombre = '"+_sNombre+"', "
	        		   		+ "AnosServicio = "+_iAnosServicio+", FechaValidezLicencia = '"+sFechaValidezLicencia+"' "
	        		   				+ "WHERE Identificador = "+_iIdentificador);
	           
	           System.out.println("Agente actualizado correctamente");
	           
        }catch (SQLException ee) { throw ee; }
        finally 
        {
	           if (connection != null) connection.close();
        }
	}
	
	/**
	 * Realiza una consulta dado un conjunto de parámetros como patrón de búsqueda
	 * @throws Exception
	 * @param sNombre, iAnosServicio, cFechaValidezLicencia
	 * @return ArrayList<Agente>
	 */
	public static ArrayList<Agente> Select(String sNombre, 
			int iAnosServicio, Calendar calFechaValidezLicencia) throws Exception
	{
		Connection connection = null;
        ResultSet resultSet = null;
        ArrayList<Agente> agentes=new ArrayList<Agente>();
        try 
        {
               
        	   SimpleDateFormat sdfFecha = new SimpleDateFormat("yyyy-MM-dd");
	           String sFechaValidezLicencia = sdfFecha.format(calFechaValidezLicencia.getTime());
	           connection = Data.Connection();
	           resultSet = connection.createStatement().executeQuery("SELECT * FROM agente where "
	        		   		+ "Nombre like '%"+sNombre+"%' AND "
	        		   		+ "AnosServicio = "+iAnosServicio+" AND "
	        		   				+ "FechaValidezLicencia like '%"+sFechaValidezLicencia+"%'");
	           
	           if( resultSet.next())
	           {
	        	   while ( resultSet.next() )
		           {
		        	   Agente agenteObtenido = new Agente( resultSet.getInt( "Identificador" ) );
		        	   agentes.add( agenteObtenido );
		           } 
	           }else{
	        	   System.out.println("No se han encontrado agentes que cumplan los criterios de búsqueda");
	           }
	           
	           
	           
	           
        }catch (SQLException ee) { throw ee; }
        finally 
        {
	           if (resultSet != null) resultSet.close();
	           if (connection != null) connection.close();
        }
        return agentes;
	}
	
	/**
	 * Obtiene los datos del Agente correspondiente al identificador dado
	 * @throws Exception
	 * @param iIdentificador
	 */
	public Agente (int iIdentificador) throws Exception
	{
		Connection connection = null;
        ResultSet resultSet = null;
        try 
        {
	           connection = Data.Connection();
	           resultSet = connection.createStatement().executeQuery(
	        		   "SELECT * FROM agente WHERE Identificador = "+iIdentificador);
	           
	           if(resultSet.next())
        	   {
	        	   _iIdentificador = iIdentificador;
	        	   _sNombre = resultSet.getString( "Nombre" );
	           	   _iAnosServicio = resultSet.getInt( "AnosServicio" );
	           	   
	           	   String sFechaValidezLicencia = resultSet.getString( "FechaValidezLicencia" );
	           	   DateFormat dfFecha = new SimpleDateFormat("yyyy-MM-dd");
	           	   Date tFechaValidezLicencia = dfFecha.parse(sFechaValidezLicencia);
	           	   
		           _calFechaValidezLicencia = Calendar.getInstance();
		           _calFechaValidezLicencia.setTime(tFechaValidezLicencia);
        	   }else{
        		   throw new Exception("No existen agentes con ese identificador");
        	   }
	           
	           
	           
	           
        }catch (SQLException ee) { throw ee; }
        finally 
        {
	           if (resultSet != null) resultSet.close();
	           if (connection != null) connection.close();
        }
        Data.LastId(connection);
	}
	
	/**
	 * Inserta un nuevo Agente en la BD
	 * @throws Exception
	 * @param iIdentificador, sNombre, iAnosServicio, cFechaValidezLicencia
	 */
	public static Agente New (String sNombre , 
							int iAnosServicio , Calendar calFechaValidezLicencia) throws Exception
	{
		Connection connection = null;
		ResultSet resultSet = null;
        try 
        {
	           /*cFechaValidezLicencia = Calendar.getInstance();
	           cFechaValidezLicencia.add(Calendar.DATE,1);*/
	           SimpleDateFormat sdfFecha = new SimpleDateFormat("yyy-MM-dd");
	           String sFechaValidezLicencia = sdfFecha.format(calFechaValidezLicencia.getTime());
	           connection = Data.Connection();
	           connection.createStatement().executeUpdate("INSERT INTO `agente` "
	        		   		+ "(Nombre , AnosServicio, FechaValidezLicencia) "
	        		   		+ "VALUES"
	        		   		+ "('"+sNombre+"' , "+iAnosServicio+" ,'"
	        		   				+ ""+sFechaValidezLicencia+"')");
	           
	           System.out.println("El Agente "+sNombre+" fue insertado exitosamente en la base de datos");
	           
	           resultSet = connection.createStatement().executeQuery(Data.LastId(connection));
	           
	           Agente agenteCreado = null;
	           
	           if(resultSet.next())
	        	   agenteCreado = new Agente(resultSet.getInt("LAST_INSERT_ID()"));
	           
	           return agenteCreado;
	           
        }catch (SQLException ee) { throw ee; }
        finally 
        {
	           if (connection != null) connection.close();
        }
        
	}
	
	/**
	 * Concatena la informacinn del Agente en una cadena
	 * @return String
	 */
	@Override
	public String toString() 
	{
        
		return super.toString().concat( "Identificador: " ).concat ( new Integer(getIdentificador()).toString() )
                .concat(";").concat( " Nombre: " ).concat ( getNombre() )
                .concat(";").concat( " Anos de servicio: " ).concat ( new Integer(getAnosServicio()).toString() ) 
                .concat(";").concat( " Validez de licencia: " ).concat ( getFechaValidezLicencia().toString() );
				
	}
}
